home *** CD-ROM | disk | FTP | other *** search
- /* PANEL . C A library of Control Panel
- #
- % Copyright (c) Jin, Guojun
- %
- % This file includes SLIDER, Multiple-Key BUTTON and Press BUTTON
- % routines for creating, drawing, reading, setting, and controling
- % their key or position. TextLine() is used for window input with
- % a multiple-key button. It is better to keep it right side empty.
- % When button or slider created, its valid=1; If valid=0, it is
- % not active at all.
- % Use GetCloseColor() and GetGray() to set colors & grays from colormap.
- % They must be set by other program after the color-map initialized.
- %
- % Memory allocation:
- % zalloc() will zero all cells but is slower than nzalloc().
- %
- % AUTHOR: Jin Guojun - Lawrence Berkeley Laboratory 4/1/91
- */
-
- #include "panel.h"
-
- #ifndef ButtonTColor
- #define ButtonTColor Green
- #endif
- #ifndef PB_Fill
- #define PB_Fill lightGray
- #endif
-
- int PopLineHeight;
- PColor Black, White, Visible, darkGray, lightGray, Gray,
- Red, Green, Blue, Yellow,
- black1, white1, gray1, HBGround=BGround;
- XColor graylevel[MaxColors]; /* locally calculate or store(load) to VCT */
-
-
- /*=======================================================
- % Following routines are to build panel & parts %
- =======================================================*/
- Panel*
- CreatePanel(x, y, w, h, name, parent, WEMask)
- char *name;
- WinAttribute *parent;
- {
- register Panel *p=zalloc(sizeof(*p), 1, name);
-
- p->expose = PrtCAST &p->event;
- p->root = parent->root;
- p->dpy = parent->dpy;
- p->colormap = parent->cmap;
- p->name = str_save(name);
- p->x0 = x; p->y0 = y;
- p->width = w; p->height = h;
- p->icon_width = 0; /* no icon */
-
- WEMask |= ButtonAction | KeyPressMask | PointerMotionMask;
- CreateWindow(p, parent, XCreateFontCursor(p->dpy, XC_top_left_arrow), WEMask,
- True, 0);
- SetFontGetSize(p, "8x13bold");
- XSelectInput(p->dpy, p->win, WEMask | ExposureMask);
- return p;
- }
-
- Slider*
- CreateSlider(p, x, y, scale, v0, v1, numb, vert, name, info, bc, rc)
- Panel *p;
- char *name, *info;
- {
- register Slider *s;
- register int i, slen;
-
- stry: slen = (v1 - v0) / scale;
- if (vert && slen+y > p->height || !vert && slen+x > p->width) {
- scale++; goto stry;
- }
- s = zalloc(sizeof(*s), 1, name);
- s->defscale = s->scale = scale;
- s->defmin = (s->min = v0) / scale;
- s->defmax = (s->max = v1) / scale;
- s->numb = numb;
- s->rl = slen;
- s->rw = RailWidth;
- s->rx = x; s->ry = y;
- s->rcolor = rc;
- s->pan = p;
- s->sx = zalloc(numb, sizeof(*(s->sx)), "sx");
- s->sy = zalloc(numb, sizeof(*(s->sy)), "sy");
- s->vert = vert;
- if (vert){
- s->sh = HandleWidth;
- s->sw = HandleHeight;
- s->sy[0] = y;
- s->sx[0] = x - (s->sw-s->rw >> 1);
- if (numb>1){
- s->sy[1] = s->sy[0] + s->sh;
- s->sx[1] = s->sx[0];
- }
- }
- else { /* horizontal */
- s->sw = HandleWidth;
- s->sh = HandleHeight;
- s->sx[0] = x;
- s->sy[0] = y - (s->sh-s->rw >> 1);
- if (numb>1){
- s->sx[1] = s->sx[0] + s->sw;
- s->sy[1] = s->sy[0];
- }
- }
- s->name = str_save(name);
- s->namex = s->rx - strlen(s->name)*p->font_w - (TextLMargin>>1);
- i = strlen(info)+1;
- s->info = zalloc(i, 1, info);
- if (i>1){
- strcpy(s->info, info);
- s->infy = s->sy[0] - (HandleHeight >> 1) - TextVMargin;
- }
- else s->infy = s->sy[0] - p->font_h;
- s->infx = s->rx + (slen - p->font_w * i >> 1) + (TextLMargin>>1);
- s->scolor = zalloc(numb, sizeof(*(s->scolor)), "scolor");
- for (i=numb--; i--;)
- if (bc < 128) /* bc is color entry */
- s->scolor[i] = bc + (numb-i << 4);
- else
- s->scolor[i] = bc - (numb-i << 3);
- s->tcolor = Green;
- #ifdef _DEBUG_
- message("npos=%d, ipos=%d, rx=%d, rl=%d\n", s->namex, s->infx, s->rx, s->rl);
- #endif
- s->valid = True;
- return s;
- }
-
- Button*
- CreateButton(p, x, y, numb, name, bname, bc, pc)
- Panel *p;
- char *name, **bname;
- {
- register Button *b;
- register int i, w;
-
- /* 4 is rough estimation for average words in each button */
- if (x + p->font_w * 4 * numb > p->width || y+ButtonHeight > p->height)
- prgmerr(numb, "Button %s out of panel", name);
- b = zalloc(sizeof(*b), 1, name);
- b->name = str_save(name);
- b->namex = x - strlen(name)*p->font_w - 4;
- b->bname = zalloc(sizeof(*(b->bname)), numb, "bname");
- b->bw = zalloc(sizeof(*(b->bw)), numb, "bwidth");
- b->x = x;
- b->y = y;
- b->hei = ButtonHeight;
- b->numb = numb;
- for (i=w=0; i<numb; i++){
- w += b->bw[i] = strlen(bname[i])*p->font_w + (TextLMargin<<1);;
- b->bname[i] = zalloc(strlen(bname[i])+1, 1, bname[i]);
- strcpy(b->bname[i], bname[i]);
- }
- b->rmb = w;
- b->color = zalloc(numb, sizeof(*(b->color)), "Bcolor");
- for (i=numb; i--;)
- b->color[i] = bc; /* button color */
- b->dimcolor = pc; /* pressed color */
- b->tcolor = ButtonTColor;
- b->pan = p;
- b->valid = True;
- return b; /* bw & bname will be set by user */
- }
-
- PressButton*
- CreatePressButton(p, x, y, name, pc)
- Panel *p;
- char *name;
- {
- register int len = strlen(name)+1;
- register PressButton *pb;
- if (x<0 || x + len > p->width || y<0 || y + ButtonHeight > p->height)
- prgmerr(len, "PButton %s not fit in panel", name);
- pb = zalloc(sizeof(*pb), 1, name);
- pb->x = x;
- pb->y = y;
- pb->hei = ButtonHeight;
- pb->len = len*p->font_w + TextLMargin;
- pb->name = str_save(name);
- pb->color.p = pc; /* pressed color */
- pb->color.v = PB_Fill;
- pb->tcolor = black1;
- pb->pan = p;
- pb->valid = True;
- return pb;
- }
-
- #define PmMg 2
-
- PopMenu*
- CreatePopMenu(pan, parent, name, menu, num)
- Panel *pan;
- WinAttribute* parent;
- char *name, *menu[];
- {
- register int i, w=0, sl;
- register PopMenu* pm = zalloc(sizeof(*pm), 1, name);
-
- pm->items = i = num;
- while (i--)
- if ((sl=strlen(menu[i])) > w) w = sl;
- if ((sl=strlen(name)+4) > w) w = sl;
- pm->name = str_save(name);
- pm->dpy = pan->dpy;
- pm->x0 = pan->x0;
- pm->y0 = pan->y0 + pan->height + 8;
- PopLineHeight = 15 + PmMg;
- pm->w = w * 9 + TextLMargin;
- pm->h = num * PopLineHeight;
- pm->bgcolor = White;
- pm->fgcolor = Black;
- CreateWindow(pm, parent, 0, PointerMotionMask | ButtonAction, True, 0);
- XSetWindowBackground(parent->dpy, pm->win, pm->bgcolor);
- SetFontGetSize(pm, "9x15");
- pm->menu = menu;
- return pm;
- }
-
- #ifdef __STDC__
- #define PrepColor(c) XSetForeground(pm->dpy, pm->gc, pm->##c##gcolor);
- #else
- #define PrepColor(c) XSetForeground(pm->dpy, pm->gc, pm->/**/c/**/gcolor);
- #endif
- #define FillItem(i) XFillRectangle(pm->dpy, pm->win, pm->gc,\
- 0, (i)*PopLineHeight, pm->w, PopLineHeight);
- #define WriteItem(i) { register char* p=pm->menu[i]; \
- XDrawString(pm->dpy, pm->win, pm->gc, \
- PmMg, (i)*PopLineHeight+pm->font_h, p, strlen(p)); }
- #define DrawItem(i, g) { FillItem(i); PrepColor(g); WriteItem(i); }
-
- PopingMenu(pm, n_th, expos, imgp, ni) /* place cursor on n_th item */
- PopMenu *pm;
- void (*expos)();
- Image **imgp;
- {
- Window rw;
- int cx, cy, bw, dp;
- XEvent event;
- register int i;
-
- pm->interface = (VType*)&event;
- TopWindow(pm,True);
- XGetGeometry(pm->dpy, pm->win, &rw, &pm->x0, &pm->y0, &cx, &cy, &bw, &dp);
- while(!XCheckMaskEvent(pm->dpy, ButtonAction, &event));
- XWarpPointer(pm->dpy, event.xbutton.window, pm->win, 0, 0, 0, 0,
- pm->w>>1, --n_th * PopLineHeight);
- PrepColor(b);
- XFillRectangle(pm->dpy, pm->win, pm->gc, 0, 0, pm->w, pm->h);
- PrepColor(f);
- for (i=pm->items; i--;)
- WriteItem(i);
-
- while(!XCheckMaskEvent(pm->dpy, ButtonReleaseMask, &event)){
- if (XCheckMaskEvent(pm->dpy, PointerMotionMask, &event)){
- cx = event.xmotion.x;
- cy = event.xmotion.y;
- pm->which = cy / (pm->font_h+PmMg) + 1;
- if (cx>0 && cx<pm->w && cy>0 && cy<pm->h && i != pm->which){
- if (i-- > 0)
- DrawItem(i, f);
- i = pm->which;
- DrawItem(i-1, b);
- }
- }
- if (expos && XCheckMaskEvent(pm->dpy, ExposureMask, &event)) {
- register Image* ip=NULL;
- register int in;
- if (imgp && (in=WhichImage(event.xany.window, imgp, ni))>=0)
- ip = imgp[in];
- expos(&event, ip);
- }
- }
- while(!XCheckMaskEvent(pm->dpy, ButtonAction, &event));
- HidingPopMenu(pm);
- pm->which=0;
- return i;
- }
- #undef PmMg
- #undef PrepColor
- #undef FillItem
- #undef WriteItem
- #undef DrawItem
-
- /*=======================================================
- % Following routines are to control panel parts %
- =======================================================*/
- DrawButton(b)
- register Button *b;
- {
- register int i, p=0;
- if (b->valid)
- for (i=0; i<b->numb; i++) {
-
- XSetForeground(b->pan->dpy, b->pan->gc,
- i==ButtonState(b) ? b->dimcolor : b->color[i]);
- XFillRectangle(b->pan->dpy, b->pan->win, b->pan->gc, b->x+p, b->y,
- b->bw[i]-2, b->hei);
- XSetForeground(b->pan->dpy, b->pan->gc,
- i==ButtonState(b) ? Black : b->tcolor);
- XDrawString(b->pan->dpy, b->pan->win, b->pan->gc, b->x + p + TextLMargin,
- b->y + TextVMargin, b->bname[i], strlen(b->bname[i]));
- p += b->bw[i];
- }
- else
- for (i=0; i<b->numb; i++) {
-
- XSetForeground(b->pan->dpy, b->pan->gc,
- i==ButtonState(b) ? b->color[i] : b->dimcolor);
- XDrawRectangle(b->pan->dpy, b->pan->win, b->pan->gc, b->x+p, b->y,
- b->bw[i]-2, b->hei);
- XSetForeground(b->pan->dpy, b->pan->gc, darkGray); /* buttom title */
- XDrawString(b->pan->dpy, b->pan->win, b->pan->gc, b->x + p + TextLMargin,
- b->y + TextVMargin, b->bname[i], strlen(b->bname[i]));
- p += b->bw[i];
- }
- XSetForeground(b->pan->dpy, b->pan->gc, white1); /* title name */
- XDrawString(b->pan->dpy, b->pan->win, b->pan->gc, b->namex, b->y + TextVMargin,
- b->name, strlen(b->name));
- XFlush(b->pan->dpy);
- }
-
- DrawPressButton(pb)
- register PressButton *pb;
- {
- if (pb->valid) {
- XSetForeground(pb->pan->dpy, pb->pan->gc, pb->color.s[pb->state]);
- XFillArc(pb->pan->dpy, pb->pan->win, pb->pan->gc, pb->x, pb->y, pb->len, pb->hei,
- 0, 360<<6);
- XSetForeground(pb->pan->dpy, pb->pan->gc, Yellow);
- XDrawArc(pb->pan->dpy, pb->pan->win, pb->pan->gc,
- pb->x, pb->y, pb->len, pb->hei, 0, 360<<6);
- }
- else {
- XSetForeground(pb->pan->dpy, pb->pan->gc, Yellow);
- XDrawArc(pb->pan->dpy, pb->pan->win, pb->pan->gc,
- pb->x, pb->y, pb->len, pb->hei, 0, 360<<6);
- }
- XSetForeground(pb->pan->dpy, pb->pan->gc, pb->tcolor);
- XDrawString(pb->pan->dpy, pb->pan->win, pb->pan->gc,
- pb->x + TextLMargin, pb->y + TextVMargin, pb->name, strlen(pb->name));
- XFlush(pb->pan->dpy);
- }
-
-
- DrawSlider(s)
- register Slider *s;
- {
- register int i = s->rl+s->rx-s->namex+TextLMargin;
- char value[32];
-
- if (!s->valid) return;
- if (s->numb>1) i += s->rx - s->namex;
- XClearArea(s->pan->dpy, s->pan->win, s->namex, s->ry-s->pan->font_h-RailWidth,
- i, s->sh+TextVMargin, 0);
- XSetForeground(s->pan->dpy, s->pan->gc, s->rcolor); /* draw rail */
- XFillRectangle(s->pan->dpy, s->pan->win, s->pan->gc, s->rx, s->ry, s->rl+s->sw,
- RailWidth);
- for (i=0; i<s->numb; i++){
- XSetForeground(s->pan->dpy, s->pan->gc, s->scolor[i]);
- XFillRectangle(s->pan->dpy, s->pan->win, s->pan->gc, s->sx[i], s->sy[i],
- s->sw, s->sh);
- }
- XSetForeground(s->pan->dpy, s->pan->gc, s->tcolor);/* write name */
- XDrawString(s->pan->dpy, s->pan->win, s->pan->gc, s->namex,
- s->ry+s->pan->font_h, s->name, strlen(s->name));
- XDrawLine(s->pan->dpy, s->pan->win, s->pan->gc, s->namex, s->ry, s->rx-2, s->ry);
- sprintf(value, "%d", ReadSlider(s, 1));
- XDrawString(s->pan->dpy, s->pan->win, s->pan->gc, s->namex,
- s->ry-(s->pan->font_h>>1), value, strlen(value));
-
- if (s->numb>1) { /* on the top of another number
- XSetForeground(s->pan->dpy, s->pan->gc, s->scolor[1]);
- XDrawLine(s->pan->dpy, s->pan->win, s->pan->gc,
- s->namex, s->ry-s->pan->font_h-RailWidth,
- s->rx-2, s->ry-s->pan->font_h-RailWidth);
- sprintf(value, "%d", ReadSlider(s, 2));
- XDrawString(s->pan->dpy, s->pan->win, s->pan->gc, s->namex,
- s->ry-s->pan->font_h - TextVMargin, value, strlen(value));
- }
- */ XSetForeground(s->pan->dpy, s->pan->gc, white1);
- sprintf(value, "%d", ReadSlider(s, 2));
- i = strlen(value);
- XDrawLine(s->pan->dpy, s->pan->win, s->pan->gc, s->rx+s->rl+s->sw+4,
- s->ry, s->rx+s->rl+s->sh+i*s->pan->font_w, s->ry);
- XDrawString(s->pan->dpy, s->pan->win, s->pan->gc, s->rx+s->rl+s->sw+4,
- s->ry-(s->pan->font_h>>1), value, i);
- }
- SliderInfo(s, Gray);
- }
-
- SliderInfo(s, color)
- register Slider *s;
- {
- char value[32];
- register int slen = strlen(s->info);
- XSetForeground(s->pan->dpy, s->pan->gc, color);
- if (slen)
- XDrawString(s->pan->dpy, s->pan->win, s->pan->gc, s->infx,
- s->infy, s->info, slen);
- sprintf(value, "%d", s->min);
- slen = strlen(value);
- XDrawString(s->pan->dpy, s->pan->win, s->pan->gc, s->rx,
- s->infy, value, slen);
- sprintf(value, "%d", s->max);
- slen = strlen(value);
- XDrawString(s->pan->dpy, s->pan->win, s->pan->gc,
- s->rx + s->rl - s->pan->font_w*slen, s->infy, value, slen);
- XFlush(s->pan->dpy);
- }
-
- ChangeSliderScale(s, scale, active)/* scale=0 reset scale to default */
- register Slider *s;
- {
- s->scale = scale ? scale : s->defscale;
- s->min = s->defmin * s->scale;
- s->max = s->defmax * s->scale;
- if (active){
- EraseSlider(s);
- DrawSlider(s);
- }
- }
-
- /* set Slider Bar in value (p) postion. */
- SetSBarRPos(s, p, bar)
- register Slider *s;
- {
- if (bar > s->numb || p < s->min || p > s->max) return 0;
- p -= s->min;
- if (s->vert)
- return s->sy[bar-1] = p / s->scale + s->ry;
- else return s->sx[bar-1] = p / s->scale + s->rx;
- }
-
- /* set Slider Bar postion by point on panel */
- SetSBarPos(s, x, y, bar)
- register Slider *s;
- {
- if (bar > s->numb) return 0;
- if (!s->vert)
- if (x < s->rx || x > s->rx+s->rl) return 0;
- else s->sx[bar-1] = x;
- else if (y < s->ry || y > s->ry+s->rl) return 0;
- else s->sy[bar-1] = y;
- #ifdef _DEBUG_
- if (DEBUGANY){
- message("SB(%d): rx=%d, ry=%d, sx1=%d, sy1=%d", bar,
- s->rx, s->ry, s->sx[0], s->sy[0]);
- if (s->numb>1)
- message(" sx2=%d, sy2=%d",s->sx[1], s->sy[1]);
- mesg("\n");
- }
- #endif
- DrawSlider(s);
- return 1;
- }
-
- /* return Bar ID (number=1, 2,...); 0 is nothing on a Bar */
- OnSliderBar(s, xbutton)
- register Slider *s;
- XButtonEvent *xbutton;
- {
- register int i, x=xbutton->x, y=xbutton->y;
- if (!s->valid || xbutton->window != s->pan->win) return 0;
- if (s->vert){ /* vert */
- if (x < s->sx[0] || x > s->sx[s->numb-1] + s->sw) return 0;
- for (i=0; i<s->numb; i++)
- if (y >= s->sy[i] && y < s->sy[i] + s->sh) return i+1;
- }
- else {
- if (y < s->sy[0] || y > s->sy[s->numb-1] + s->sh) return 0;
- for (i=0; i<s->numb; i++)
- if (x >= s->sx[i] && x < s->sx[i] + s->sw) return i+1;
- }
- return 0;
- }
-
- OnButton(b, xbutton)
- register Button *b;
- XButtonEvent *xbutton;
- {
- register int i, w, x=xbutton->x, y=xbutton->y;
-
- if (xbutton->window != b->pan->win || !b->valid) return False;
-
- #ifdef _DEBUG_
- DEBUGMESSAGE("OnB: x=%d, y=%d, bx=%d, by=%d, rmb=%d\n", x,y,b->x,b->y,b->rmb);
- #endif
- x -= b->x;
- if (y < b->y || y > b->y + b->hei || x < 0 || x > b->rmb)
- return -1;
- for (i=w=0; i<b->numb; i++){
- w += b->bw[i];
- if (x < w)
- if (i == ButtonState(b)) return 0;
- else{
- ButtonState(b) = i++;
- DrawButton(b);
- return i;
- }
- }
- }
-
- bool
- ButtonPressed(pb, xbutton)
- PressButton *pb;
- XButtonEvent *xbutton;
- {
- register bool state;
- register int x=xbutton->x, y=xbutton->y;
- if (!pb->valid || pb->state || xbutton->window != pb->pan->win)
- return False;
- state = (x>=pb->x && x<pb->x+pb->len && y>=pb->y && y<pb->y+pb->hei);
- if (state){
- PressButtonState(pb) = state;
- DrawPressButton(pb);
- }
- return state;
- }
-
- void
- ResetPressButton(pb)
- register PressButton *pb;
- {
- PressButtonState(pb) = RESETSTATE;
- DrawPressButton(pb);
- }
-
-
- ReadSlider(s, h)
- register Slider *s;
- {
- register int tmp;
- register float scale = ((float)s->max - s->min) / s->rl;
- if (h<1 || h>s->numb) h = s->numb;
- h--;
- if (s->vert)
- tmp = s->sy[h];
- else tmp = s->sx[h];
- return (tmp - s->rx) * scale + s->min;
- }
-
- /*=======================================================
- % return currently pressed button name(label) %
- % It may be defined as a macro define %
- =======================================================*/
- char*
- ReadButton(b)
- Button *b;
- {
- return b->bname[ButtonState(b)];
- }
-
- void
- EraseSlider(s)
- register Slider *s;
- {
- if (s->vert)
- XClearArea(s->pan->dpy, s->pan->win, s->namex - TextLMargin, 0,
- (TextLMargin<<1) + s->rl + s->rx - s->namex + s->sw, 0, 0);
- else /* correct */
- XClearArea(s->pan->dpy, s->pan->win, 0, s->infy-TextVMargin,
- 0, s->sy[0] - s->infy + (TextVMargin<<1) + s->sh, 0);
- }
-
- /*===============================================
- % A text line editor for panel input %
- % if x0 = 0, use right side area of b %
- % else use information area of panel %
- ===============================================*/
- TextLine(b, buf, len, x0, exp_hd, imgp, imgs)
- Button *b;
- char *buf;
- int len, x0, (*exp_hd)(), imgs;
- Image *imgp; /* for exposure handle */
- {
- int bufl=strlen(buf), chars_line, max_field, /* maximum text filed */
- cursor_p, sl, ys, y0; /* top of the text line */
- char str[16];
- bool nodone=1, new=bufl;
-
- if (!x0){
- x0 = b->x + b->rmb;
- y0 = b->y;
- }
- else y0 = b->pan->height - (b->pan->font_h-1<<1);
-
- ys = y0 + (b->hei>>1); /* string height */
-
- chars_line = (b->pan->width - x0) / b->pan->font_w - 1;
- max_field = MIN(len*b->pan->font_w, b->pan->width - x0);
- XClearArea(b->pan->dpy, b->pan->win, x0, y0, max_field, b->hei, 0);
- XSetForeground(b->pan->dpy, b->pan->gc, white1);
- XDrawLine(b->pan->dpy, b->pan->win, b->pan->gc, x0, y0+b->hei,
- x0+max_field, y0+b->hei);
- cursor_p = MIN(bufl, chars_line);
- if (cursor_p)
- XDrawString(b->pan->dpy, b->pan->win, b->pan->gc, x0, ys,
- buf + (bufl<chars_line ? 0 : bufl-cursor_p), cursor_p);
- XBell(b->pan->dpy, 0); /* beep to start input */
-
- do {
- XComposeStatus status;
- KeySym keysym;
- FlushingCursor(b->pan, exp_hd, imgp, imgs, x0 + cursor_p*b->pan->font_w,
- y0, b->pan->font_w, b->pan->font_h, 15, 0);
- sl = XLookupString(&b->pan->event, str, 16, &keysym, &status);
-
- str[sl] = 0; /* set end of string */
- if (str[0] == BS | *str == 0x7F){ /* ctrl-H or DEL */
- if (!bufl) continue;
- if (bufl-- <= chars_line){
- XClearArea(b->pan->dpy, b->pan->win,
- x0+cursor_p*b->pan->font_w, y0, b->pan->font_w, b->hei, 0);
- cursor_p = bufl;
- }
- else {
- XClearArea(b->pan->dpy, b->pan->win, x0, y0, max_field, b->hei, 0);
- XDrawString(b->pan->dpy, b->pan->win, b->pan->gc, x0, ys,
- buf + bufl-cursor_p, cursor_p);
- }
- buf[bufl] = new = 0;
- }
- else if (str[0] == Esc) return 0; /* Undo */
- else if (str[0] == Tab){ /* Cat. So set new to False */
- new = 0; continue;
- }
- else if (nodone = str[0] - '\r'){
- if (new){ /* clear all to start a new line */
- XClearArea(b->pan->dpy, b->pan->win, x0,y0,max_field,b->hei,0);
- XSetForeground(b->pan->dpy, b->pan->gc, white1);
- XDrawLine(b->pan->dpy, b->pan->win, b->pan->gc, x0, y0+b->hei,
- x0+max_field, y0+b->hei);
- buf[0] = new = cursor_p = bufl = 0;
- }
- strcat(buf, str);
- bufl += sl;
- if (bufl <= chars_line){
- XDrawString(b->pan->dpy, b->pan->win, b->pan->gc,
- x0+cursor_p*b->pan->font_w, ys, str, sl);
- cursor_p = bufl; /* set cursor position */
- }
- else{
- XClearArea(b->pan->dpy, b->pan->win, x0, y0, max_field, b->hei, 0);
- XDrawString(b->pan->dpy, b->pan->win, b->pan->gc,
- x0, ys, buf + bufl-cursor_p, cursor_p);
- }
- }
- }while (nodone && strlen(buf)<len);
- return strlen(buf);
- }
-
- /*=======================================================
- % display message at bottom area of the panel %
- =======================================================*/
- DispInfo(p, xoffset, str, color)
- Panel *p;
- char *str;
- {
- XClearArea(p->dpy, p->win, xoffset, p->height-(p->font_h<<1),
- p->width-xoffset, p->font_h<<1, 0);
- XSetForeground(p->dpy, p->gc, color);
- XDrawString(p->dpy, p->win, p->gc, xoffset+p->font_w, p->height-p->font_h,
- str, strlen(str));
- XFlush(p->dpy);
- }
-
- /*=======================================================
- % display message onto right area of panel parts %
- % or onto given place. If any of x0, y0 and len %
- % is zero, then it will be set to parts->x, %
- % parts->y and length of the right area of parts %
- =======================================================*/
- PanelMessage(pp, pmsg, x0, y0, len)
- AnyParts* pp;
- char *pmsg;
- register int x0, y0, len;
- {
- if (!x0) x0 = pp->x+pp->w;
- if (!y0) y0 = pp->y-1;
- if (!len) len = pp->pan->width - pp->x - pp->pan->font_w;
- XClearArea(pp->pan->dpy, pp->pan->win, x0, y0, len, pp->pan->font_h+2, 0);
- XSetForeground(pp->pan->dpy, pp->pan->gc, pp->vcolor);
- XDrawString(pp->pan->dpy, pp->pan->win, pp->pan->gc,
- x0, y0+pp->pan->font_h, pmsg, strlen(pmsg));
- XFlush(pp->pan->dpy);
- }
-